#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>

// 子进程信号处理函数
void handle_child_signal(int sig) {
    printf("Child process (PID: %d) received signal %d and is exiting.\n", getpid(), sig);
    exit(0);
}

// 父进程信号处理函数
void handle_parent_signal(int sig) {
    pid_t child1, child2;
    int status;

    // 创建第一个子进程
    child1 = fork();
    if (child1 < 0) {
        perror("Failed to fork child 1");
        exit(EXIT_FAILURE);
    } else if (child1 == 0) {
        // 子进程 1 注册信号处理函数
        signal(SIGUSR1, handle_child_signal);
        while (1) {
            pause(); // 等待信号
        }
    }

    // 创建第二个子进程
    child2 = fork();
    if (child2 < 0) {
        perror("Failed to fork child 2");
        exit(EXIT_FAILURE);
    } else if (child2 == 0) {
        // 子进程 2 注册信号处理函数
        signal(SIGUSR2, handle_child_signal);
        while (1) {
            pause(); // 等待信号
        }
    }

    // 父进程向子进程发送信号
    kill(child1, SIGUSR1);
    kill(child2, SIGUSR2);

    // 父进程等待子进程结束
    waitpid(child1, &status, 0);
    waitpid(child2, &status, 0);

    // 父进程退出
    printf("Parent process is terminating.\n");
    exit(0);
}

int main() {
    // 父进程注册信号处理函数
    signal(SIGQUIT, handle_parent_signal);
    signal(SIGALRM, handle_parent_signal);

    // 设置定时器，5 秒后触发 SIGALRM 信号
    alarm(5);

    // 父进程进入无限循环等待信号
    while (1) {
        pause(); // 等待信号
    }

    return 0;
}